Tumor evolution project

Data used

In this notebook, we are using the maf_autopsy.tsv file generated from the 01-preprocess-data.Rmd script. We will also use the oncoprint goi list from OpenPedCan oncoprint-goi-lists-OpenPedCan-gencode-v39.csv.

Set up

suppressPackageStartupMessages({
  library(tidyverse)
  library(ggrepel)
})

Directories and File Inputs/Outputs

# Detect the ".git" folder. This will be in the project root directory.
# Use this as the root directory to ensure proper sourcing of functions
# no matter where this is called from.
root_dir <- rprojroot::find_root(rprojroot::has_dir(".git"))
scratch_dir <- file.path(root_dir, "scratch")
analysis_dir <- file.path(root_dir, "analyses", "tmb-vaf-longitudinal") 
input_dir <- file.path(analysis_dir, "input")

# Input files
maf_autopsy_file <- file.path(scratch_dir, "maf_autopsy.tsv")
oncoprint_goi_file <- file.path(input_dir, "oncoprint-goi-lists-OpenPedCan-gencode-v39.csv")

# File path to plots directory
plots_dir <-
  file.path(analysis_dir, "plots")
if (!dir.exists(plots_dir)) {
  dir.create(plots_dir)
}

source(paste0(analysis_dir, "/util/function-create-corplot.R"))
source(paste0(root_dir, "/figures/theme.R"))

Read in data and process

# Read maf_autopsy file generated from step `01-process-data.Rmd`
maf_autopsy <- readr::read_tsv(maf_autopsy_file, guess_max = 100000, show_col_types = FALSE)

# Read oncoprint_goi_file
# We will use the following list of genes and then we will create a label to select the ones for the corplots.
oncoprint_goi <- read.csv(oncoprint_goi_file, stringsAsFactor = FALSE) %>%
  select(LGAT, Embryonal.tumor, HGAT, Other) 

# let's create a list with the genes to be used for the corplots
oncoprint_goi <- data.frame(goi_list = unlist(oncoprint_goi)) 

# remove empty rows
oncoprint_goi <- oncoprint_goi[!apply(oncoprint_goi == "", 1, all), ] 
oncoprint_goi <- data.frame(oncoprint_goi)

Corplots for each Patient case and per biospecimen_id and timepoint

# We will define samples based on the "Kids_First_Participant_ID" column 
samples <- unique(as.character(maf_autopsy$Kids_First_Participant_ID))
print(samples)
 [1] "PT_23NZGSRJ" "PT_37B5JRP1" "PT_6N825561" "PT_CXT81GRM" "PT_DNAJYFZT" "PT_HFQNKP5X" "PT_KBFM551M" "PT_KTRJ8TFY" "PT_KZ56XHJT" "PT_MDWPRDBT"
[11] "PT_MNSEJCDM" "PT_PR4YBBH3"
for (i in seq_along(samples)) {
  print(i)
  maf_sub <- maf_autopsy %>%
    filter(Kids_First_Participant_ID == samples[i])
  timepoints_other_plots <- unique(maf_sub$timepoints_other)
  timepoints_other_plots <- timepoints_other_plots[!timepoints_other_plots == "4"]
  print(timepoints_other_plots)
  timepoints_deceased_plots <- unique(maf_sub$timepoints_deceased)
  timepoints_deceased_plots <- timepoints_deceased_plots[!timepoints_deceased_plots %in% c("1", "2", "3")]
  print(timepoints_deceased_plots)
  
# Run corplot
  for (t in seq_along(timepoints_deceased_plots)){
    for (k in seq_along(timepoints_other_plots)){
      fname <- paste0(plots_dir, "/", samples[i], "-", timepoints_other_plots[k], "-vs-", timepoints_deceased_plots[t], "-vaf-corplot.pdf")
      print(fname)
      p <- create_corplot(maf = maf_sub,
                          timepoints_other_plot = timepoints_other_plots[k],
                          timepoints_deceased_plot = timepoints_deceased_plots[t],
                          sid = samples[i])
      pdf(file = fname, width = 10, height = 8)
      print(p)
      dev.off()
    }
  }
  }  
[1] 1
[1] "Diagnosis_BS_05S9WJW6"
character(0)
[1] 2
[1] "Diagnosis_BS_EJV0N3BX"
character(0)
[1] 3
[1] "Progressive_BS_E0S2Y0TS"
character(0)
[1] 4
[1] "Diagnosis_BS_HZNKSQ17"
character(0)
[1] 5
[1] "Recurrence_BS_EJ1H9PZY"
character(0)
[1] 6
[1] "Progressive_BS_FBJ516WW"
character(0)
[1] 7
[1] "Diagnosis_BS_9P4NDTKJ" "Diagnosis_BS_M0B42FPR" "Diagnosis_BS_M5FM63EB" "Diagnosis_BS_WYTDVC0Y"
[1] "Deceased_BS_J8EK6RNF"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KBFM551M-Diagnosis_BS_9P4NDTKJ-vs-Deceased_BS_J8EK6RNF-vaf-corplot.pdf"
Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
Please use tidy evaluation idioms with `aes()`. 
See also `vignette("ggplot2-in-packages")` for more information.
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KBFM551M-Diagnosis_BS_M0B42FPR-vs-Deceased_BS_J8EK6RNF-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KBFM551M-Diagnosis_BS_M5FM63EB-vs-Deceased_BS_J8EK6RNF-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KBFM551M-Diagnosis_BS_WYTDVC0Y-vs-Deceased_BS_J8EK6RNF-vaf-corplot.pdf"
[1] 8
[1] "Diagnosis_BS_3VKW5988" "Diagnosis_BS_402W79TS" "Diagnosis_BS_BQ81D2BP"
[1] "Deceased_BS_5968GBGT" "Deceased_BS_AF5D41PD" "Deceased_BS_EE73VE7V" "Deceased_BS_HYKV2TH9"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KTRJ8TFY-Diagnosis_BS_3VKW5988-vs-Deceased_BS_5968GBGT-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KTRJ8TFY-Diagnosis_BS_402W79TS-vs-Deceased_BS_5968GBGT-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KTRJ8TFY-Diagnosis_BS_BQ81D2BP-vs-Deceased_BS_5968GBGT-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KTRJ8TFY-Diagnosis_BS_3VKW5988-vs-Deceased_BS_AF5D41PD-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KTRJ8TFY-Diagnosis_BS_402W79TS-vs-Deceased_BS_AF5D41PD-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KTRJ8TFY-Diagnosis_BS_BQ81D2BP-vs-Deceased_BS_AF5D41PD-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KTRJ8TFY-Diagnosis_BS_3VKW5988-vs-Deceased_BS_EE73VE7V-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KTRJ8TFY-Diagnosis_BS_402W79TS-vs-Deceased_BS_EE73VE7V-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KTRJ8TFY-Diagnosis_BS_BQ81D2BP-vs-Deceased_BS_EE73VE7V-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KTRJ8TFY-Diagnosis_BS_3VKW5988-vs-Deceased_BS_HYKV2TH9-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KTRJ8TFY-Diagnosis_BS_402W79TS-vs-Deceased_BS_HYKV2TH9-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KTRJ8TFY-Diagnosis_BS_BQ81D2BP-vs-Deceased_BS_HYKV2TH9-vaf-corplot.pdf"
[1] 9
[1] "Progressive_BS_0ATJ22QA" "Progressive_BS_9DN4QR6E" "Diagnosis_BS_FWP8ZA4K"   "Diagnosis_BS_H8NWA41N"  
[1] "Deceased_BS_1Q524P3B" "Deceased_BS_22VCR7DF" "Deceased_BS_AK9BV52G" "Deceased_BS_D6STCMQS" "Deceased_BS_X5VN0FW0" "Deceased_BS_YHXMYDBN"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Progressive_BS_0ATJ22QA-vs-Deceased_BS_1Q524P3B-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Progressive_BS_9DN4QR6E-vs-Deceased_BS_1Q524P3B-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Diagnosis_BS_FWP8ZA4K-vs-Deceased_BS_1Q524P3B-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Diagnosis_BS_H8NWA41N-vs-Deceased_BS_1Q524P3B-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Progressive_BS_0ATJ22QA-vs-Deceased_BS_22VCR7DF-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Progressive_BS_9DN4QR6E-vs-Deceased_BS_22VCR7DF-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Diagnosis_BS_FWP8ZA4K-vs-Deceased_BS_22VCR7DF-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Diagnosis_BS_H8NWA41N-vs-Deceased_BS_22VCR7DF-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Progressive_BS_0ATJ22QA-vs-Deceased_BS_AK9BV52G-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Progressive_BS_9DN4QR6E-vs-Deceased_BS_AK9BV52G-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Diagnosis_BS_FWP8ZA4K-vs-Deceased_BS_AK9BV52G-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Diagnosis_BS_H8NWA41N-vs-Deceased_BS_AK9BV52G-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Progressive_BS_0ATJ22QA-vs-Deceased_BS_D6STCMQS-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Progressive_BS_9DN4QR6E-vs-Deceased_BS_D6STCMQS-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Diagnosis_BS_FWP8ZA4K-vs-Deceased_BS_D6STCMQS-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Diagnosis_BS_H8NWA41N-vs-Deceased_BS_D6STCMQS-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Progressive_BS_0ATJ22QA-vs-Deceased_BS_X5VN0FW0-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Progressive_BS_9DN4QR6E-vs-Deceased_BS_X5VN0FW0-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Diagnosis_BS_FWP8ZA4K-vs-Deceased_BS_X5VN0FW0-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Diagnosis_BS_H8NWA41N-vs-Deceased_BS_X5VN0FW0-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Progressive_BS_0ATJ22QA-vs-Deceased_BS_YHXMYDBN-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Progressive_BS_9DN4QR6E-vs-Deceased_BS_YHXMYDBN-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Diagnosis_BS_FWP8ZA4K-vs-Deceased_BS_YHXMYDBN-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-Diagnosis_BS_H8NWA41N-vs-Deceased_BS_YHXMYDBN-vaf-corplot.pdf"
[1] 10
[1] "Recurrence_BS_00TRPEQX"  "Recurrence_BS_BQWMQM2Y"  "Progressive_BS_D368BNRD"
character(0)
[1] 11
[1] "Diagnosis_BS_CBMAWSAR" "Diagnosis_BS_ZSH09N84"
[1] "Deceased_BS_J8EH1N7V" "Deceased_BS_Y74XAFJX"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_MNSEJCDM-Diagnosis_BS_CBMAWSAR-vs-Deceased_BS_J8EH1N7V-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_MNSEJCDM-Diagnosis_BS_ZSH09N84-vs-Deceased_BS_J8EH1N7V-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_MNSEJCDM-Diagnosis_BS_CBMAWSAR-vs-Deceased_BS_Y74XAFJX-vaf-corplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_MNSEJCDM-Diagnosis_BS_ZSH09N84-vs-Deceased_BS_Y74XAFJX-vaf-corplot.pdf"
[1] 12
character(0)
[1] "Deceased_BS_C2NH5FDT"

LS0tCnRpdGxlOiAiQ3JlYXRlIFZBRiBjb3JwbG90cyBvZiB0dW1vcnMgYWNyb3NzIG11bHRpcGxlIHRpbWVwb2ludHMgZm9yIHRociBhdXRvcHN5IHNhbXBsZXMgaW4gdGhlIFBCVEEgQ29ob3J0IgphdXRob3I6ICdBbnRvbmlhIENocm9uaSA8Y2hyb25pYUBjaG9wLmVkdT4gYW5kIEpvIEx5bm5lIFJva2l0YSA8cm9raXRhQGNob3AuZWR1PiBmb3IgRDNCJwpkYXRlOiAiMjAyMyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQotLS0KCiMjIyMgVHVtb3IgZXZvbHV0aW9uIHByb2plY3QgCgojIyMgRGF0YSB1c2VkIApJbiB0aGlzIG5vdGVib29rLCB3ZSBhcmUgdXNpbmcgdGhlIGBtYWZfYXV0b3BzeS50c3ZgIGZpbGUgZ2VuZXJhdGVkIGZyb20gdGhlIGAwMS1wcmVwcm9jZXNzLWRhdGEuUm1kYCBzY3JpcHQuCldlIHdpbGwgYWxzbyB1c2UgdGhlIG9uY29wcmludCBnb2kgbGlzdCBmcm9tIE9wZW5QZWRDYW4gYG9uY29wcmludC1nb2ktbGlzdHMtT3BlblBlZENhbi1nZW5jb2RlLXYzOS5jc3ZgLgoKIyBTZXQgdXAKCmBgYHtyIGxvYWQtbGlicmFyeX0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKHsKICBsaWJyYXJ5KHRpZHl2ZXJzZSkKICBsaWJyYXJ5KGdncmVwZWwpCn0pCmBgYAoKIyMgRGlyZWN0b3JpZXMgYW5kIEZpbGUgSW5wdXRzL091dHB1dHMKCmBgYHtyIHNldC1kaXItYW5kLWZpbGUtbmFtZXN9CiMgRGV0ZWN0IHRoZSAiLmdpdCIgZm9sZGVyLiBUaGlzIHdpbGwgYmUgaW4gdGhlIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkuCiMgVXNlIHRoaXMgYXMgdGhlIHJvb3QgZGlyZWN0b3J5IHRvIGVuc3VyZSBwcm9wZXIgc291cmNpbmcgb2YgZnVuY3Rpb25zCiMgbm8gbWF0dGVyIHdoZXJlIHRoaXMgaXMgY2FsbGVkIGZyb20uCnJvb3RfZGlyIDwtIHJwcm9qcm9vdDo6ZmluZF9yb290KHJwcm9qcm9vdDo6aGFzX2RpcigiLmdpdCIpKQpzY3JhdGNoX2RpciA8LSBmaWxlLnBhdGgocm9vdF9kaXIsICJzY3JhdGNoIikKYW5hbHlzaXNfZGlyIDwtIGZpbGUucGF0aChyb290X2RpciwgImFuYWx5c2VzIiwgInRtYi12YWYtbG9uZ2l0dWRpbmFsIikgCmlucHV0X2RpciA8LSBmaWxlLnBhdGgoYW5hbHlzaXNfZGlyLCAiaW5wdXQiKQoKIyBJbnB1dCBmaWxlcwptYWZfYXV0b3BzeV9maWxlIDwtIGZpbGUucGF0aChzY3JhdGNoX2RpciwgIm1hZl9hdXRvcHN5LnRzdiIpCm9uY29wcmludF9nb2lfZmlsZSA8LSBmaWxlLnBhdGgoaW5wdXRfZGlyLCAib25jb3ByaW50LWdvaS1saXN0cy1PcGVuUGVkQ2FuLWdlbmNvZGUtdjM5LmNzdiIpCgojIEZpbGUgcGF0aCB0byBwbG90cyBkaXJlY3RvcnkKcGxvdHNfZGlyIDwtCiAgZmlsZS5wYXRoKGFuYWx5c2lzX2RpciwgInBsb3RzIikKaWYgKCFkaXIuZXhpc3RzKHBsb3RzX2RpcikpIHsKICBkaXIuY3JlYXRlKHBsb3RzX2RpcikKfQoKc291cmNlKHBhc3RlMChhbmFseXNpc19kaXIsICIvdXRpbC9mdW5jdGlvbi1jcmVhdGUtY29ycGxvdC5SIikpCnNvdXJjZShwYXN0ZTAocm9vdF9kaXIsICIvZmlndXJlcy90aGVtZS5SIikpCmBgYAoKIyMgUmVhZCBpbiBkYXRhIGFuZCBwcm9jZXNzCmBgYHtyIHJlYWRfaW5wdXRfZmlsZXN9CiMgUmVhZCBtYWZfYXV0b3BzeSBmaWxlIGdlbmVyYXRlZCBmcm9tIHN0ZXAgYDAxLXByb2Nlc3MtZGF0YS5SbWRgCm1hZl9hdXRvcHN5IDwtIHJlYWRyOjpyZWFkX3RzdihtYWZfYXV0b3BzeV9maWxlLCBndWVzc19tYXggPSAxMDAwMDAsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCgojIFJlYWQgb25jb3ByaW50X2dvaV9maWxlCiMgV2Ugd2lsbCB1c2UgdGhlIGZvbGxvd2luZyBsaXN0IG9mIGdlbmVzIGFuZCB0aGVuIHdlIHdpbGwgY3JlYXRlIGEgbGFiZWwgdG8gc2VsZWN0IHRoZSBvbmVzIGZvciB0aGUgY29ycGxvdHMuCm9uY29wcmludF9nb2kgPC0gcmVhZC5jc3Yob25jb3ByaW50X2dvaV9maWxlLCBzdHJpbmdzQXNGYWN0b3IgPSBGQUxTRSkgJT4lCiAgc2VsZWN0KExHQVQsIEVtYnJ5b25hbC50dW1vciwgSEdBVCwgT3RoZXIpIAoKIyBsZXQncyBjcmVhdGUgYSBsaXN0IHdpdGggdGhlIGdlbmVzIHRvIGJlIHVzZWQgZm9yIHRoZSBjb3JwbG90cwpvbmNvcHJpbnRfZ29pIDwtIGRhdGEuZnJhbWUoZ29pX2xpc3QgPSB1bmxpc3Qob25jb3ByaW50X2dvaSkpIAoKIyByZW1vdmUgZW1wdHkgcm93cwpvbmNvcHJpbnRfZ29pIDwtIG9uY29wcmludF9nb2lbIWFwcGx5KG9uY29wcmludF9nb2kgPT0gIiIsIDEsIGFsbCksIF0gCm9uY29wcmludF9nb2kgPC0gZGF0YS5mcmFtZShvbmNvcHJpbnRfZ29pKQpgYGAKCiMjIENvcnBsb3RzIGZvciBlYWNoIFBhdGllbnQgY2FzZSBhbmQgcGVyIGJpb3NwZWNpbWVuX2lkIGFuZCB0aW1lcG9pbnQKCmBgYHtyIGNyZWF0ZV9jb3JwbG90fQojIFdlIHdpbGwgZGVmaW5lIHNhbXBsZXMgYmFzZWQgb24gdGhlICJLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEIiBjb2x1bW4gCnNhbXBsZXMgPC0gdW5pcXVlKGFzLmNoYXJhY3RlcihtYWZfYXV0b3BzeSRLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEKSkKcHJpbnQoc2FtcGxlcykKCmZvciAoaSBpbiBzZXFfYWxvbmcoc2FtcGxlcykpIHsKICBwcmludChpKQogIG1hZl9zdWIgPC0gbWFmX2F1dG9wc3kgJT4lCiAgICBmaWx0ZXIoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCA9PSBzYW1wbGVzW2ldKQogIHRpbWVwb2ludHNfb3RoZXJfcGxvdHMgPC0gdW5pcXVlKG1hZl9zdWIkdGltZXBvaW50c19vdGhlcikKICB0aW1lcG9pbnRzX290aGVyX3Bsb3RzIDwtIHRpbWVwb2ludHNfb3RoZXJfcGxvdHNbIXRpbWVwb2ludHNfb3RoZXJfcGxvdHMgPT0gIjQiXQogIHByaW50KHRpbWVwb2ludHNfb3RoZXJfcGxvdHMpCiAgdGltZXBvaW50c19kZWNlYXNlZF9wbG90cyA8LSB1bmlxdWUobWFmX3N1YiR0aW1lcG9pbnRzX2RlY2Vhc2VkKQogIHRpbWVwb2ludHNfZGVjZWFzZWRfcGxvdHMgPC0gdGltZXBvaW50c19kZWNlYXNlZF9wbG90c1shdGltZXBvaW50c19kZWNlYXNlZF9wbG90cyAlaW4lIGMoIjEiLCAiMiIsICIzIildCiAgcHJpbnQodGltZXBvaW50c19kZWNlYXNlZF9wbG90cykKICAKIyBSdW4gY29ycGxvdAogIGZvciAodCBpbiBzZXFfYWxvbmcodGltZXBvaW50c19kZWNlYXNlZF9wbG90cykpewogICAgZm9yIChrIGluIHNlcV9hbG9uZyh0aW1lcG9pbnRzX290aGVyX3Bsb3RzKSl7CiAgICAgIGZuYW1lIDwtIHBhc3RlMChwbG90c19kaXIsICIvIiwgc2FtcGxlc1tpXSwgIi0iLCB0aW1lcG9pbnRzX290aGVyX3Bsb3RzW2tdLCAiLXZzLSIsIHRpbWVwb2ludHNfZGVjZWFzZWRfcGxvdHNbdF0sICItdmFmLWNvcnBsb3QucGRmIikKICAgICAgcHJpbnQoZm5hbWUpCiAgICAgIHAgPC0gY3JlYXRlX2NvcnBsb3QobWFmID0gbWFmX3N1YiwKICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcG9pbnRzX290aGVyX3Bsb3QgPSB0aW1lcG9pbnRzX290aGVyX3Bsb3RzW2tdLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVwb2ludHNfZGVjZWFzZWRfcGxvdCA9IHRpbWVwb2ludHNfZGVjZWFzZWRfcGxvdHNbdF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkID0gc2FtcGxlc1tpXSkKICAgICAgcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCkKICAgICAgcHJpbnQocCkKICAgICAgZGV2Lm9mZigpCiAgICB9CiAgfQogIH0gIApgYGAKCmBgYHtyIGVjaG89VFJVRX0Kc2Vzc2lvbkluZm8oKQpgYGAKCg==